package ejb;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entities.Escursione;
import entities.Hotel;
import entities.PacchettoViaggio;
import entities.Volo;

/**
 * Session Bean implementation class PacchettoViaggioMgrBean
 */
@Stateless
public class PacchettoViaggioMgrBean implements PacchettoViaggioMgrBeanLocal {

	@PersistenceContext
    private EntityManager em;

	@Override
	public void aggiungi(PacchettoViaggioDTO pacchetto){
		PacchettoViaggio nuovo = creaPacchetto(pacchetto);
		em.persist(nuovo);
	}
	
	@Override
	public int aggiungiPersonaliz(PacchettoViaggioDTO pacchetto){
		PacchettoViaggio nuovo = creaPacchetto(pacchetto);
		em.persist(nuovo);
		em.flush();
		return nuovo.getIdPacchettoViaggio();
	}
	
	@Override
	public void modifica(PacchettoViaggioDTO pacchetto, int indice){
		Query q1 = em.createNamedQuery("PacchettoViaggio.FIND_ONE");
		q1.setParameter("id", indice);
		PacchettoViaggio p = (PacchettoViaggio)q1.getSingleResult();
		List<Hotel> hotelLista = new ArrayList<Hotel>();
		for(HotelDTO h: pacchetto.getAlternativeHotel()){
			Query q5 = em.createNamedQuery("Hotel.FIND_ONE");
			q5.setParameter("id", h.getIdHotel());
			hotelLista.add((Hotel)q5.getSingleResult());
		}
		List<Escursione> escursioneLista = new ArrayList<Escursione>();
		for(EscursioneDTO e: pacchetto.getAlternativeEsc()){
			Query q6 = em.createNamedQuery("Escursione.FIND_ONE");
			q6.setParameter("id", e.getIdEscursione());
			escursioneLista.add((Escursione)q6.getSingleResult());
		}
		p.setAlternativeHotel(hotelLista);
	    p.setAlternativeEsc(escursioneLista);
	     
	    Volo voloAnd = em.find(Volo.class, pacchetto.getVoloAndata().getIdVolo());
	    p.setVoloAndata(voloAnd);
	    Volo voloRit = em.find(Volo.class, pacchetto.getVoloRitorno().getIdVolo());
	    p.setVoloRitorno(voloRit);
	    Hotel hotel = em.find(Hotel.class, pacchetto.getHotel().getIdHotel());
	    p.setHotel(hotel);
	    Escursione esc = em.find(Escursione.class, pacchetto.getEscursione().getIdEscursione());
	    p.setEscursione(esc);
	     
	    Query q = em.createNamedQuery("PacchettoViaggio.MODIFICA");
		q.setParameter("id", indice);
		q.setParameter("nome", pacchetto.getNome());
		q.setParameter("destinazione", pacchetto.getDestinazione());
		q.setParameter("dataInizio", pacchetto.getDataInizio());
		q.setParameter("dataFine", pacchetto.getDataFine());
		q.setParameter("dataPartenza", pacchetto.getDataPartenza());
		q.setParameter("dataRitorno", pacchetto.getDataRitorno());
		q.setParameter("numeroPersone", pacchetto.getNumeroPersone());
		q.setParameter("prezzo", pacchetto.getPrezzo());
		q.executeUpdate();
	}
	
	private PacchettoViaggio trova(int id) {
    	return em.find(PacchettoViaggio.class, id);
    }
	
	public List<?> getPacchettiViaggio() {
    	return em.createNamedQuery("PacchettoViaggio.FIND_ALL", Volo.class).getResultList();
    }

	public void elimina(int indice){
		System.out.println("stampo:" + indice);
		Query q = em.createNamedQuery("PacchettoViaggio.CANCELLA");
		q.setParameter("id", indice);
		q.executeUpdate();
	}
	
	public PacchettoViaggioDTO getPacchettoViaggioDTO(int indice) {
		PacchettoViaggio pacchetto = trova(indice);
		PacchettoViaggioDTO pacchettoViaggioDTO = convertToDTO(pacchetto);
		return pacchettoViaggioDTO;
	}

	 private PacchettoViaggioDTO convertToDTO(PacchettoViaggio pacchetto) {
		PacchettoViaggioDTO pacchettoViaggioDTO = new PacchettoViaggioDTO();
		pacchettoViaggioDTO.setNome(pacchetto.getNome());
		pacchettoViaggioDTO.setDestinazione(pacchetto.getDestinazione());
		pacchettoViaggioDTO.setDataInizio(pacchetto.getDataInizio());
		pacchettoViaggioDTO.setDataFine(pacchetto.getDataFine());
		pacchettoViaggioDTO.setDataPartenza(pacchetto.getDataPartenza());
		pacchettoViaggioDTO.setDataRitorno(pacchetto.getDataRitorno());
		pacchettoViaggioDTO.setNumeroPersone(pacchetto.getNumeroPersone());
		pacchettoViaggioDTO.setPrezzo(pacchetto.getPrezzo());
		pacchettoViaggioDTO.setVoloAndata(VoloMgrBean.convertToDTO(pacchetto.getVoloAndata()));
		pacchettoViaggioDTO.setVoloRitorno(VoloMgrBean.convertToDTO(pacchetto.getVoloRitorno()));
		pacchettoViaggioDTO.setHotel(HotelMgrBean.convertToDTO(pacchetto.getHotel()));
		pacchettoViaggioDTO.setEscursione(EscursioneMgrBean.convertToDTO(pacchetto.getEscursione()));
		pacchettoViaggioDTO.setAlternativeHotel(HotelMgrBean.convertToDTOLista(pacchetto.getAlternativeHotel()));
		pacchettoViaggioDTO.setAlternativeEsc(EscursioneMgrBean.convertToDTOLista(pacchetto.getAlternativeEsc()));
		return pacchettoViaggioDTO;
	}
	 
	public PacchettoViaggio creaPacchetto(PacchettoViaggioDTO pacchetto){
		PacchettoViaggio nuovo = new PacchettoViaggio();
		Query q = em.createNamedQuery("Volo.FIND_ONE");
		q.setParameter("id", pacchetto.getVoloAndata().getIdVolo());
		Volo voloAnd = (Volo)q.getSingleResult();
		Query q2 = em.createNamedQuery("Volo.FIND_ONE");
		q2.setParameter("id", pacchetto.getVoloRitorno().getIdVolo());
		Volo voloRit = (Volo)q2.getSingleResult();
		Query q3 = em.createNamedQuery("Hotel.FIND_ONE");
		q3.setParameter("id", pacchetto.getHotel().getIdHotel());
		Hotel hotel = (Hotel)q3.getSingleResult();
		Query q4 = em.createNamedQuery("Escursione.FIND_ONE");
		q4.setParameter("id", pacchetto.getEscursione().getIdEscursione());
		Escursione escursione = (Escursione)q4.getSingleResult(); 
		List<Hotel> hotelLista = new ArrayList<Hotel>();
		for(HotelDTO h: pacchetto.getAlternativeHotel()){
			Query q5 = em.createNamedQuery("Hotel.FIND_ONE");
			q5.setParameter("id", h.getIdHotel());
			hotelLista.add((Hotel)q5.getSingleResult());
		}
		List<Escursione> escursioneLista = new ArrayList<Escursione>();
		for(EscursioneDTO e: pacchetto.getAlternativeEsc()){
			Query q6 = em.createNamedQuery("Escursione.FIND_ONE");
			q6.setParameter("id", e.getIdEscursione());
			escursioneLista.add((Escursione)q6.getSingleResult());
		} 
		nuovo.setNome(pacchetto.getNome());
	    nuovo.setDestinazione(pacchetto.getDestinazione());
	    nuovo.setDataInizio(pacchetto.getDataInizio());
	    nuovo.setDataFine(pacchetto.getDataFine());
	    nuovo.setDataPartenza(pacchetto.getDataPartenza());
	    nuovo.setDataRitorno(pacchetto.getDataRitorno());
	    nuovo.setNumeroPersone(pacchetto.getNumeroPersone());
	    nuovo.setPrezzo(pacchetto.getPrezzo());
	    nuovo.setVoloAndata(voloAnd);
	    nuovo.setVoloRitorno(voloRit);
	    nuovo.setHotel(hotel);
	    nuovo.setEscursione(escursione);
	    nuovo.setAlternativeHotel(hotelLista);
	    nuovo.setAlternativeEsc(escursioneLista);
		return nuovo;
	 }
}
